package entidades;

import java.io.ByteArrayInputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.http.ParseException;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;

public class PromocionHot implements Parcelable{
	Date fechaHoraInicio;
	Date fechaHoraFin;
	String sFechaHoraInicio;
	String sFechaHoraFin;
	String titulo;
	String comercio;
	String descripcion;
	String id;
	byte[] imagen;
	int descuentoInicial, descuentoFinal;
	int stock;
	private String tipoPago, categoria;
	int tolerancia;
	long tiempoRestante;
	
	
	public long getTiempoRestante() {
	    return tiempoRestante;
	}
    /**
     * Toma la hora del servidor y en base a eso calcula el tiempo restante
     * @param horaServidor
     */
	public void setTiempoRestante(String parametroHoraServidor) 
	{
		Date horaServidor = new Date();
		SimpleDateFormat formatoDelTexto = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
		try {
			horaServidor = formatoDelTexto.parse(parametroHoraServidor);
		} catch (java.text.ParseException parseException) {
			Log.e("ERROR PARSEANDO FECHAS", parseException.getMessage());
		}
	   	
	   tiempoRestante = this.fechaHoraFin.getTime()-horaServidor.getTime();
	}
	
	public PromocionHot(){
		
	}
	
	public String getTitulo() {
		return titulo;
	}
	
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getTipoPago() {
		return tipoPago;
	}

	public void setTipoPago(String parametroTipoPago) {
		this.tipoPago = parametroTipoPago;
	}

	public String getCategoria() {
		return categoria;
	}

	public void setCategoria(String parametroCategoria) {
		this.categoria = parametroCategoria;
	}
	public void setTitulo(String parametroTitulo) {
		this.titulo = parametroTitulo;
	}
	
	public String getSfechaHoraInicio() {
		return sFechaHoraInicio;
	}
	public void setSfechaHoraInicio(String sfechaHoraInicio) {
		this.sFechaHoraInicio = sfechaHoraInicio;
	}
	public String getSfechaHoraFin() {
		return sFechaHoraFin;
	}
	
	public void setSfechaHoraFin(String sfechaHoraFin) {
		this.sFechaHoraFin = sfechaHoraFin;
	}
	
	public String getComercio() {
		return comercio;
	}
	
	public void setComercio(String parametroComercio) {
		this.comercio = parametroComercio;
	}
	
	public String getDescripcion() {
		return descripcion;
	}
	
	public void setDescripcion(String parametroDescripcion) {
		this.descripcion = parametroDescripcion;
	}
	

	
	public int getDescuentoInicial() {
		return descuentoInicial;
	}
	public void setDescuentoInicial(int descuentoInicial) {
		this.descuentoInicial = descuentoInicial;
	}
	public int getDescuentoFinal() {
		return descuentoFinal;
	}
	public void setDescuentoFinal(int descuentoFinal) {
		this.descuentoFinal = descuentoFinal;
	}
	public int getStock() {
		return stock;
	}
	
	public void setStock(int parametroStock) {
		this.stock = parametroStock;
	}
	
	public int getTolerancia() {
		return tolerancia;
	}
	
	public void setTolerancia(int parametroTolerancia) {
		this.tolerancia = parametroTolerancia;
	}
	
	public void setFechaHoraInicio(String parametroFecha){
		SimpleDateFormat formatoDelTexto = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
		try {
			this.fechaHoraInicio = formatoDelTexto.parse(parametroFecha);
			this.sFechaHoraInicio = parametroFecha;
		} catch (java.text.ParseException parseException) {
			Log.e("ERROR PARSEANDO FECHAS", parseException.getMessage());
			
		}
	}
	
	public Date getFechaHoraInicio(){
		return this.fechaHoraInicio;
	}
	
	public void setFechaHoraFin(String parametroFecha){
		SimpleDateFormat formatoDelTexto = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
		try {
			this.fechaHoraFin = formatoDelTexto.parse(parametroFecha);
			this.sFechaHoraFin = parametroFecha;
		} catch (java.text.ParseException parseException) {
			Log.e("ERROR PARSEANDO FECHAS", parseException.getMessage());
		}
	}
	
	public Date getFechaHoraFin(){
		return this.fechaHoraFin;
	}
	
	 /**
     * Este Metodo devuelve un BitMap, apartir del vector de bytes imagen
     * para poder asignarlo al imageview
     * @return
     */
    public Bitmap getImagen() {
	    Bitmap imagenBitMap;
	    if(imagen != null){
	        imagenBitMap=BitmapFactory.decodeByteArray(imagen,0,imagen.length);
	        ByteArrayInputStream conversor = new ByteArrayInputStream(imagen);
	        return BitmapFactory.decodeStream(conversor);
	    }
        else{
	        return null;
	    }
    }
    
    public byte[] getImagenByte()
    {
    	return imagen;
    }
    public void setImagen(byte[] parametroImagen) {
	    this.imagen = parametroImagen;
    }
    
    /**
     * metodo que reescala la imagen NO USAR
     * sirve para salvar las papas, pero el procesamiento de la imagen no deberia ser
     * responsabilidad del movil
     * @return
     */
    public Bitmap resizeBitmap(){
    	return Bitmap.createScaledBitmap(this.getImagen(), 92, 78, true);
    }
    
    /**
     * Este metodo devuelve la hora fin de la promocion hot
     * de momento como se acordo que son el en el mismo dia
     * solo basta con mostar eso en la lista de promociones
     * @return
     */
    public String getHoraHasta(){
    	final String[] fechaHora = this.sFechaHoraFin.split("T");
    	return fechaHora[1].substring(0, 5);
    	/**
    	 * cone sto ultimo le saco lso segundos,
    	 * si se descubre que es poco performante o hay mejro manera lo saco
    	 */
    }
    
    /**
     * Este metodo devuele un vector de enteros con las horas, minutos
     * y segundos restantes. El metodo se basa en el principio de que las promociones
     * duran menos de un dia sino falla
     * @return
     */
    public int[] tiempoCronometro(){
    	int[] tiempo = new int [3];
    	long tiempoRestanteAuxiliar = tiempoRestante;
    	long diffHoras = tiempoRestanteAuxiliar / (60 * 60 * 1000);
    	tiempoRestanteAuxiliar=tiempoRestanteAuxiliar-(diffHoras*(60 * 60 * 1000));
    	long diffMinutes = tiempoRestanteAuxiliar / (60 * 1000);
        tiempoRestanteAuxiliar=tiempoRestanteAuxiliar-(diffMinutes*(60 * 1000));
        long diffSeconds = tiempoRestanteAuxiliar / 1000;
        
        tiempo[0]=(int) diffHoras;
        tiempo[1]=(int) diffMinutes;
        tiempo[2]=(int) diffSeconds;
        
        return tiempo;
    }
    
    /**
     * Este metodo toma el vector de horas minutos y segundos
     * y lo transforma a string par amostrar el cronometro
     * @return
     */
    public String convertirTiempoAString(){
    	int[] tiempo = tiempoCronometro();
    	return ""+tiempo[0]+":"+tiempo[1]+":"+tiempo[2];
    }
    /////////////////////////////////////////////////METODOS PARA PARCELEABE///////////////////////////////
    
    /**
     * Aparentemente sirve por si empelas herencia y necesitas saber qeu clase
     * de hijo crear
     * no es el caso
     */
    public int describeContents() {
        return 0;
    }
    /**
     * Escribe el parcel
     * @param outParcel
     * @param flags
     */
    public void writeToParcel(Parcel outParcel, int flags) {
    	outParcel.writeString(sFechaHoraInicio);
    	outParcel.writeString(sFechaHoraFin);
        outParcel.writeString(titulo);
        outParcel.writeString(descripcion);
        outParcel.writeInt(descuentoInicial);
        outParcel.writeSerializable(comercio);
        outParcel.writeInt(stock);
        outParcel.writeInt(tolerancia);
        outParcel.writeString(id);
        if(imagen!=null){
        	outParcel.writeInt(1);
        	outParcel.writeInt(imagen.length);
            outParcel.writeByteArray(imagen);
        }
        else{
        	outParcel.writeInt(-1);
        }
    }
    
    public static final Parcelable.Creator<PromocionHot> CREATOR
            = new Parcelable.Creator<PromocionHot>() {
        public PromocionHot createFromParcel(Parcel inParcel) {
            return new PromocionHot(inParcel);
         }

        public PromocionHot[] newArray(int size) {
            return new PromocionHot[size];
        }
    };
    
    /** Constructor de la clase
     * que arma la clase apartir de un parcel
     * @param inParcel
     */
    private PromocionHot(Parcel inParcel) {
    	sFechaHoraInicio=inParcel.readString();
    	sFechaHoraFin=inParcel.readString();
        titulo=inParcel.readString();
        descripcion=inParcel.readString();
        inParcel.readByteArray(imagen);
        comercio=inParcel.readString();
        stock = inParcel.readInt();
        tolerancia=inParcel.readInt();
        id=inParcel.readString();
        if(inParcel.readInt()>=0){
         descuentoInicial=inParcel.readInt();
         imagen = new byte [inParcel.readInt()];
        }
    }
}
